package com.itheima.aop;

import com.itheima.mapper.OperateLogMapper;
import com.itheima.pojo.OperateLog;
import com.itheima.utils.CurrentHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Arrays;

@Aspect//  声明这是一个切面类
@Component
@Slf4j
public class OperateLogAspect {

    @Autowired
    private  OperateLogMapper operateLogMapper;//数据访问层接口


    // 定义切入点，拦截com.itheima.controller包下的所有方法
//    @Pointcut("execution(* com.itheima.controller.*.*(..))")
//    public void pt() {
//
//    }

    // 环绕通知
    @Around("@annotation(com.itheima.annotation.Log)")
    public Object recordOperateLog(ProceedingJoinPoint joinPoint) throws Throwable {
//        // 获取当前登录用户ID（这里需要根据实际认证方式调整）
//        Integer operateEmpId = getCurrentEmpId();

        // 记录开始时间
        long startTime = System.currentTimeMillis();

        // 执行原始方法
        Object result = joinPoint.proceed();

        // 记录结束时间和耗时
        long endTime = System.currentTimeMillis();
        long costTime = endTime - startTime;

        // 构建操作日志对象
        OperateLog operateLog = new OperateLog();
        operateLog.setOperateEmpId(getCurrentEmpId());
        operateLog.setOperateTime(LocalDateTime.now());
        operateLog.setClassName(joinPoint.getTarget().getClass().getName());
        operateLog.setMethodName(joinPoint.getSignature().getName());
        operateLog.setMethodParams(Arrays.toString(joinPoint.getArgs()));
        operateLog.setReturnValue(result!=null ? result.toString() : "void");
        operateLog.setCostTime(costTime);

        // 保存日志
        log.info("操作日志：{}", operateLog);
        operateLogMapper.insert(operateLog);

        // 返回原始方法返回值
        return result;
    }

    // 获取当前登录用户ID（需要根据实际认证方式实现）
    private Integer getCurrentEmpId() {
        // 这里需要根据实际认证方式获取用户ID
       return CurrentHolder.getCurrentId();

    }
}    